/**
 * @作者 zw
 * @微信公号 搬砖暗夜码农
 * @开源项目 $ https://gitee.com/zhouwei5208888/spring-boot-distributed
 * @我的博客 $ http://itzhouwei.com
 * @创建时间 2023/3/20 10:20 下午
 */
package com.itzhouwei.commerce.redis.idconfig;

import com.itzhouwei.commerce.base.IDTypeEnum;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @description:<h1>基于Redis分布式Id 生成器</h1>
 * @author：zw，微信公共号：yingshengzw
 * @date: 2021/8/28
 * @Copyright：公众号：搬砖暗夜码农 | 博客：https://itzhouwei.com - 沉淀、学习、分享、成长，让自己和他人都能有所收获！
 */
@SuppressWarnings("all")
@Slf4j
@RequiredArgsConstructor
@Component
public class Id2Generator {

    //注入 RedisTemplate
    private final RedisTemplate redisTemplate;
    //时间格式
    private DateTimeFormatter dataTimeFormatter= DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");

    /****
     * 根据业务类型生成ID
     * 规则  1位业务编码+15位日期时间 +2序列号
     * @param idTypeEnum 业务类型
     * @return 返回生成好的Id
     */
    public Long createBusinessId(IDTypeEnum idTypeEnum){
        //拿到当前时间按照格式序列化
        LocalDateTime now=LocalDateTime.now();
        String dateTime = dataTimeFormatter.format(now);
        //操作redis
        Long value=redisTemplate.opsForValue().increment(idTypeEnum.getRedisConfig(),1);
        if (value>=1000){
            value=value%1000;
        }
        String seq= StringUtils.leftPad(Long.toString(value),2,"0");

        //业务编码+ 日期时间+序列号
       return Long.parseLong(idTypeEnum.getCode()+dateTime+seq);
    }

}
